package com.youka.bussiness.common.utils;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

/**
 * @Description: 随机数工具
 * @author: liujinliang
 * @date: 2017-03-16 16:20
 */
public class RandomUtil {

    /**
     * 带有字母数字的随机数
     */
    private static String[] capital = {
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3",
            "4", "5", "6", "7", "8", "9", "0"};

    /**
     * 带有字母数字的随机数
     */
    private static String[] randomCapital = {
            "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c",
            "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
            "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y",
            "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};

    /**
     * 纯数字的随机数
     */
    private static String[] numberCapital = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};

    /**
     * 静态随机数
     */
    private static Random random = new Random();

    /**
     * 生成随机字符串
     *
     * @param num
     * @return
     */
    public static String getRandom(int num) {
        //定义随机数保存区
        ArrayList<String> temp = new ArrayList<String>();
        temp.addAll(Arrays.asList(randomCapital));

        //随机数结果保存器
        StringBuffer code = new StringBuffer();

        //得到要求位数的随机数
        for (int i = 0; i < num; i++) {
            code.append(temp.get(random.nextInt(temp.size())));
        }

        return code.toString();
    }

    /**
     * 获取随机数
     *
     * @param num
     * @return
     */
    public static String getRandom(int num, boolean number) {

        //定义随机数保存区
        ArrayList<String> temp = new ArrayList<String>();

        if (number) {
            //数字随机数
            temp.addAll(Arrays.asList(numberCapital));
        } else {
            //添加随机数
            temp.addAll(Arrays.asList(capital));
        }

        //随机数结果保存器
        StringBuffer code = new StringBuffer();

        //得到要求位数的随机数
        for (int i = 0; i < num; i++) {
            code.append(temp.get(random.nextInt(temp.size())));
        }

        return code.toString();
    }

    /**
     * 获取一个随机数
     *
     * @param min   随机数最小值
     * @param max   随机数最大值
     * @param point 保留小数点位数，最多10位
     * @return
     */
    public static String rangeRandom(double min, double max, Integer point) {
        double random = min + ((max - min) * new Random().nextDouble());
        return getDecimalFormat(point).format(random);
    }

    /**
     * 获取精确小数点放大
     * 默认返回精确到小数点后4位
     *
     * @param digit
     * @return
     */
    public static DecimalFormat getDecimalFormat(Integer digit) {
        DecimalFormat decimalFormat = new DecimalFormat("0.0000");
        switch (digit) {
            case 1:
                decimalFormat = new DecimalFormat("0.0");
                break;
            case 2:
                decimalFormat = new DecimalFormat("0.00");
                break;
            case 3:
                decimalFormat = new DecimalFormat("0.000");
                break;
            case 4:
                decimalFormat = new DecimalFormat("0.0000");
                break;
            case 5:
                decimalFormat = new DecimalFormat("0.00000");
                break;
            case 6:
                decimalFormat = new DecimalFormat("0.000000");
                break;
            case 7:
                decimalFormat = new DecimalFormat("0.0000000");
                break;
            case 8:
                decimalFormat = new DecimalFormat("0.00000000");
                break;
            case 9:
                decimalFormat = new DecimalFormat("0.000000000");
                break;
            case 10:
                decimalFormat = new DecimalFormat("0.0000000000");
                break;
        }
        return decimalFormat;
    }
}